﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLCodigoMuestra
    {
        #region Metodos

        /// <summary>
        /// Método que devuelve la lista de Relleno
        /// </summary>
        /// <returns></returns>
        public List<CodigoMuestra> ListarCodigoMuestra()
        {
            return Accesor.ListarCodigoMuestra();
        }
        /// <summary>
        /// Método que devuelve la lista de CodigoMuestra
        /// </summary>
        /// <returns></returns>
        public List<CodigoMuestra> ListarCodigoMuestraPorSerie(short codigoSerieMuestra)
        {
            return Accesor.ListarCodigoMuestraPorSerie(codigoSerieMuestra);
        }
        /// <summary>
        /// Método que devuelve la lista de CodigoMuestra
        /// </summary>
        /// <returns></returns>
        public List<CodigoMuestra> ListarCodigoMuestraPorSerieEstado(short codigoSerieMuestra, short codigoEstado)
        {
            return Accesor.ListarCodigoMuestraPorSerieEstado(codigoSerieMuestra, codigoEstado);
        }
        /// <summary>
        /// Método que devuelve la lista de Relleno
        /// </summary>
        /// <returns></returns>
        public bool ExisteRangoCodigoMuestra(short codigoSerieMuestra, int desde, int hasta)
        {
            bool retorno = false;
            var lista = Accesor.ListarCodigoMuestraPorRango(codigoSerieMuestra, desde, hasta);
            if (lista != null && lista.Count > 0) retorno = true;
            return retorno;
        }
        /// <summary>
        /// Método que devuelve la lista de CodigoMuestra
        /// </summary>
        /// <returns></returns>
        public int ObtenerSeguienteCodigoMuestraPorSerie(short codigoSerieMuestra)
        {
            return Accesor.ObtenerSeguienteCodigoMuestraPorSerie(codigoSerieMuestra);
        }
        /// <summary>
        /// Insertar un nuevo codigo de muestra
        /// </summary>
        /// <param name="codigoMuestra"></param>
        /// <returns></returns>
        public string GenerarCodigoMuestra(short codigoSerieMuestra, int desde, int hasta)
        {
            string retorno = "Correcto";
            if (this.ExisteRangoCodigoMuestra(codigoSerieMuestra, desde, hasta))
            {
                retorno = "Ya existe registrado en el rango indicado";
                return retorno;
            }

            var serie = new DASerieMuestra().ObtenerSerieMuestra(codigoSerieMuestra);
            if (serie == null)
            {
                retorno = "Serie no está definido";
                return retorno;
            }

            string letraSerie = serie.DescripcionCorta.Substring(0, 1);

            CodigoMuestra codigoMuestra = null;
            using (TransactionScope transaction = new TransactionScope())
            {

                for (int icodigo = desde; icodigo <= hasta; icodigo++)
                {
                    codigoMuestra = new CodigoMuestra();
                    codigoMuestra.CodigoSerieMuestra = codigoSerieMuestra;
                    codigoMuestra.CodigoMuestra1 = icodigo.ToString().PadLeft(7, '0') + letraSerie;
                    codigoMuestra.CodigoEstado = 1; //Estado Generado
                    Accesor.InsertarCodigoMuestra(codigoMuestra);
                }
                transaction.Complete();
                retorno = "Generado";
            }

            return retorno;
        }
        /// <summary>
        /// Modifica un Codigo de muestra
        /// </summary>
        /// <param name="Canal"></param>
        public void ModificarCodigoMuestra(CodigoMuestra codigoMuestra)
        {

            Accesor.ModificarCodigoMuestra(codigoMuestra);

        }
        /// <summary>
        /// Elimina Codigo de muestra
        /// </summary>
        /// <param name="labor"></param>
        public void EliminarCodigoMuestra(string codigoMuestra)
        {
            var codigoMuestra1 = Accesor.ObtenerCodigoMuestra(codigoMuestra);
            if (codigoMuestra1.CodigoEstado == 1)
            {
                Accesor.EliminarCodigoMuestra(codigoMuestra1); //Elimina solo estado [Generado]
            }
        }
        /// <summary>
        /// Elimina Codigo de muestra
        /// </summary>
        /// <param name="labor"></param>
        public void EliminarCodigoMuestra1(List<string> codigosMuestra)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                foreach (var item in codigosMuestra)
                {
                    var codigoMuestra1 = Accesor.ObtenerCodigoMuestra(item);
                    //if (codigoMuestra1.Estado == 1)
                    Accesor.EliminarCodigoMuestra(codigoMuestra1);
                }
                transaction.Complete();
            }
        }
        /// <summary>
        /// Método que devuelve CodigoMuestra por codigo
        /// </summary>
        /// <param name="codigoRelleno"></param>
        /// <returns></returns>
        public CodigoMuestra ObtenerCodigoMuestra(string codigoMuestra)
        {
            return Accesor.ObtenerCodigoMuestra(codigoMuestra);
        }
        /// <summary>
        /// Retorna la lista de Codigo de Muestra
        /// </summary>
        /// <param name="estado"></param>
        /// <param name="serie"></param>
        /// <returns></returns>
        public List<buscarCodigoMuestra_Result> BuscarCodigoMuestra(int codigoEstado, short codigoSerieMuestra)
        {
            return Accesor.BuscarCodigoMuestra(codigoEstado, codigoSerieMuestra);
        }
        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem()
        {

            var result = Accesor.ListarCodigoMuestra();
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestra1, Text = x.CodigoMuestra1 }).ToList();

        }
        /// <summary>
        /// Método que devuelve la lista de CodigoMuestra
        /// </summary>
        /// <returns></returns>
        public List<CodigoMuestra> ListarCodigoMuestraPorSerieEstadoYCodigo(short codigoSerieMuestra, short codigoEstado, string codigoMuestra)
        {
            return Accesor.ListarCodigoMuestraPorSerieEstadoYCodigo(codigoSerieMuestra, codigoEstado, codigoMuestra);
        }
                /// <summary>
        /// Método que devuelve un CodigoMuestra
        /// </summary>
        /// <returns></returns>
        public CodigoMuestra ObtenerCodigoMuestraPorSerieEstadoYCodigo(short codigoSerieMuestra, short codigoEstado, string codigoMuestra)
        {
            return Accesor.ObtenerCodigoMuestraPorSerieEstadoYCodigo(codigoSerieMuestra, codigoEstado, codigoMuestra);
        }

        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem1(short codigoSerieMuestra)
        {

            var result = Accesor.ListarCodigoMuestraPorSerie(codigoSerieMuestra);
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestra1, Text = x.CodigoMuestra1 }).ToList();

        }
        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem2(short codigoSerieMuestra, short codigoEstado)
        {

            var result = Accesor.ListarCodigoMuestraPorSerieEstado(codigoSerieMuestra, codigoEstado);
            return result
                .Select(x => new ListItemString { Value = x.CodigoMuestra1, Text = x.CodigoMuestra1 }).ToList();

        }

        /// <summary>
        /// Método que devuelve CodigoMuestra Completo segun serie y numero ingresado con Estado=Generado
        /// </summary>
        /// <param name="codigoSerieMuestra"></param>
        /// <param name="codigoBuscar"></param>
        /// <returns></returns>
        public string ObtenerCodigoMuestraGenerado(short codigoSerieMuestra, int numeroBuscar)
        {
            string codigoGenerado = Accesor.ObtenerCodigoMuestraGenerado(codigoSerieMuestra, numeroBuscar);
            if (string.IsNullOrEmpty(codigoGenerado)) codigoGenerado = "NOEXISTE";
            return codigoGenerado;
        }
        #endregion

        #region Accesor
        private static DACodigoMuestra Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DACodigoMuestra(); }
        }
        #endregion
    }
}
